Runtime Environment
栈帧 Stack Frame
- 活动记录 activation record / 栈帧 stack frame:栈中用来存放一个函数的局部变量、参数、返回地址和其他临时变量的区域。
- 栈帧布局的涉及要考虑到 指令集的体系结构 特征和被编译的程序设计语言的特征
- 栈指针 SP
- 帧指针 FP
- 因为栈帧的大小在编译处理的后期才能知道,故使用帧指针以较早指导位移量的形式参数和局部变量放在靠近帧指针处
- 寄存器
- 将局部变量、表达式的中间结果和其他值保存在寄存器中,有助于编译生成的程序快速运行
- 参数传递:分为用寄存器传递和用栈帧传递两种
- 寄存器传递的情况
- 属于叶过程 的参数
- 在调用其他过程前,参数已经完成所需要的所有操作
- 使用了优化编译器进行 过程间寄存器分配
- 返回地址 return address
- 栈帧内的变量
- 必须放入栈帧的情况
- 变量作为传地址参数(在 C 语言中,即
&a
)
- 变量被嵌套在当前过程内访问
- 变量的值太大无法放入寄存器
- 变量为数组
- 存在太多局部变量和临时变量,以至于无法全部放入寄存器中
- 静态链
- 在允许声明 嵌套函数 的语言(如 Pascal、ML 和 Tiger),内层函数可以使用外层函数声明的变量,这种语言特征称为 块结构 block structure.
- 静态链是实现嵌套函数的一种方法:每当调用函数
f
时,传递给 f
一个指针,该指针指向静态包含 f
的那个函数,该指针被称为静态链